#include <REGX52.H>
#include  <intrins.h>
#include "delay.h"
#include "DS18B20.h"

struct Temperature tpr={0,0,0,0,0}; 
/******************************************************************
函数名：DS18B20复位函数
调用：
参数：
返回值：
功能：
备注：
******************************************************************/
bit DS18_init(void)
{
   bit presence;
   EA=0;
     DQ = 1;      //DQ复位
     Delaynus(1);    //稍做延时
     DQ = 0;      //将DQ拉低
     Delaynus(32);   //精确延时 大于 480us
     DQ = 1;       //拉高总线
     Delaynus(3);		 //60
     presence = DQ;    //读取存在信号
     Delaynus(32);
     DQ = 1;  
		 EA=1;	
     return(presence); //返回信号，0=presence,1= no presence
}

/******************************************************************
函数名：读1位函数
调用：
参数：
返回值：
功能：
备注：
******************************************************************/
unsigned char DS18_readbit(void)
{

   
	bit dat;
   // unsigned char i;
    EA=0;
	DQ=1;
	_nop_();
    DQ=0;     		 //将DQ 拉低开始读时间隙
    _nop_();
	DQ=1;			   //释放总线
	_nop_();   
	_nop_();     
	dat=DQ;			// then return high 
	Delaynus(3);	                	// 延时60μs
	DQ=1;
	EA=1;
    return(dat); 			// 返回 DQ 线上的电平值
   
}

/******************************************************************
函数名：写1位函数
调用：
参数：
返回值：
功能：
备注：
******************************************************************/
void DS18_writebit(unsigned char dat)
{
	
    	EA=0;
        DQ = 0; 
		_nop_();
		_nop_();				       // 将DQ 拉低开始写时间隙
        if(dat==1)	     
		DQ =1; 			                           // 如果写1，DQ 返回高电平
        Delaynus(3); 				      // 在时间隙内60保持电平值，
        DQ = 1;   
     	EA=1;
}


/******************************************************************
函数名：读1字节函数
调用：
参数：
返回值：
功能：
备注：
******************************************************************/
unsigned char DS18_readbyte(void)
{
unsigned char i = 0;
unsigned char dat = 0;

for (i=0;i<8;i++) 
{ 
    dat>>=1;				
// 读取字节，每次读取一个字节
  if(DS18_readbit()) 
   dat|=0x80;   	// 然后将其左移
     
  }

    return (dat);
}

/******************************************************************
函数名：写1字节函数
调用：
参数：
返回值：
功能：
备注：
******************************************************************/
void DS18_writebyte(unsigned char dat)
{
  unsigned char i = 0;
  unsigned char temp;

   for (i=0; i<8; i++) 	// 写入字节, 每次写入一位 
   {   		
   temp=0x01&dat;  		
   DS18_writebit(temp); 
   dat>>=1;  
  }
}



/******************************************************************
函数名：温度转换启动函数
调用：
参数：
返回值：
功能：
备注：
******************************************************************/
bit DS18_CONVERT()
{
   bit prese; //返回校验位
/*************启动温度转换****************/
   EA=0;
   prese=DS18_init();
   DS18_writebyte(0xcc);
   DS18_writebyte(0x44);
   EA=1;
   return prese;
}


/******************************************************************
函数名：DS18B20获取温度函数
调用：
参数：
返回值：
功能：
备注：
******************************************************************/
void  DS18_GET(void)
{
	bit prese;//返回校验位
	unsigned char temp=0;
	/*************获取温度****************/
   prese=DS18_init();
   EA=0; 
   DS18_writebyte(0xcc);
   DS18_writebyte(0xbe);
   tpr.LSB=DS18_readbyte();
   tpr.MSB=DS18_readbyte();
   EA=1;
/*************数据处理部分****************/
   tpr.cc=tpr.LSB&0xF0;//
   tpr.cc>>=4;
   temp=0x07&tpr.MSB;
   temp<<=4;
   tpr.cc=tpr.cc+temp;
   tpr.xs=tpr.LSB&0x0F;
   tpr.xs=(10*tpr.xs+8)/16; //8是四舍五入，相当于加0.5；
   if( tpr.xs==10){
	  tpr.xs=0;
	  tpr.cc++;
	  }
	
}




